#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*

	char *strtok ( char * str, const char * delimiters );

	char *strsep(char **stringp, const char *delim);

	strtok和strsep均可用于str字符串的分割。

	相同部分：

		对该函数的调用序列将str拆分为token，这些token是由作为定界符一部分的任何字符分隔的连续字符的序列。

		首次调用时，该函数需要一个C字符串作为str的参数，该字符串的第一个字符用作扫描令牌的起始位置。
		在随后的调用中，该函数需要一个空指针，并使用最后一个标记结束后的位置作为扫描的新起始位置。

		为了确定token的开头和结尾，该函数首先从起始位置扫描未包含在定界符中的第一个字符（该字符成为token的开头）。
		然后从token的开头开始扫描定界符中包含的第一个字符，该字符成为token的末尾。如果找到终止的空字符，扫描也会停止。

		token的此结尾将自动替换为空字符（NULL），并且token的开头由函数返回。

		一旦在对strtok的调用中找到了str的终止null字符，此函数的所有后续调用（将null指针作为第一个参数）都将返回null指针。

		找到下一个标记的点由在下一次调用时使用的函数在内部保留（不需要特殊的库实现来避免数据争用）。

		因此，两者都会对原字符串进行修改。

	不同部分：

		1.strtok（）和strsep（）之间的主要区别在于strtok（）是C标准的，因此也是通过POSIX）；
			而strsep（）不是标准化的（通过C或POSIX；它在GNU C中可用） 库，起源于BSD。

			对于内核编程中，是没有strtok函数的，因此只能使用strtok。

		2.strtok内部记录上次调用字符串的位置，所以是不可重入的，不支持多线的，其可重入版本为strtok_r。

		strsep使用传入的参数来确定字符串的起始位置，是可重入的，也是Linux kernel推荐的函数，strtok的替代品。

		3.当遇到多个连续的分隔符时，strtok会把这些多个连续的分割符当做一个来处理，而strsep会依次处理，会返回空字符串。
*/

#define STRING_FOR_TESTING "{0x1,0x2}, {{{{{{{{{{{{0x3,0x4}, {0x5,0x6},{0x7,0x8},{0x9,0x10},{0x11,0x12},{0x13,0x14},"

int main()
{
    char input[] = STRING_FOR_TESTING;
    char input_tok[] = STRING_FOR_TESTING;
    char input_sep[] = STRING_FOR_TESTING;
    char *token;
    char *pCur;
 
    printf("origin input: %s, size:%lu\n", input, sizeof(input));
 
    printf("************ strtok start ************\n");
    printf("input_tok=%p\n", input_tok);
 
    token = strtok(input_tok, "{");
    while (token != NULL)
    {
        printf("strtok:%s -- token=%p\n", token, token);
        token = strtok(NULL, "{");
    }
 
    printf("now input: %85s, size:%lu\n", input_tok, sizeof(input_tok));
 
    printf("************ strtok  end  ************\n");
 
    printf("************ strsep start ************\n");
 
    pCur = input_sep;
    printf("input_sep=%p\n", input_sep);
 
    token = strsep(&pCur, "{");
    while (token != NULL)
    {
        printf("strsep:%s-- token=%p  pCur=%p\n", token, token, pCur);
        token = strsep(&pCur, "{");
    }
 
    printf("now input: %85s, size:%lu\n", input_sep, sizeof(input_sep));
 
    printf("************ strsep  end  ************\n");
 
    return 0;
}
